package multi_thread.master.executors;

import basic.RuntimeExample;

import java.time.LocalDateTime;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author Cheng Jun
 * Description: 固定容量的线程池——核心线程数固定
 * 优点：固定的线程数量，控制了CPU的消耗；
 * 缺点：workQueue 参数是 LinkedBlockingQueue，无界的队列有可能会引起 OOM
 * CPU 密集型：一般为"CPU 的核心数+1"。CPU 密集型任务使得 CPU 使用率很高，开过多的线程数，会增加上下文切换的次数，会带来额外的开销
 * IO 密集型：一般为"CPU 核心数的 2 倍"。IO 密集型任务的 CPU 使用率不高，因此可以让 CPU 在等待 IO 的时候去处理别的任务，充分利用 CPU 时间
 * 摘自《JavaConcurrencyInPractise》(8.2 节)
 * @version 1.0
 * @date 2022/5/19 14:45
 * @see Executors#newFixedThreadPool(int)
 * @see RuntimeExample
 */
public class Executor_FixedThreadPool {

    public static void main(String[] args) {
        int processors = Runtime.getRuntime().availableProcessors();
        System.out.println("本机可用CPU数量：" + processors);
        // 固定容量的线程池的容量设置一般是 cpu的核数 乘以 2
        // ExecutorService fixedThreadPool = Executors.newFixedThreadPool(processors * 2);
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(processors);
        for (int i = 0; i < 16; i++) {
            Runnable task = () -> {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " 时间：" + LocalDateTime.now());
            };
            fixedThreadPool.execute(task);
            System.out.println("提交任务时间：" + LocalDateTime.now());
        }
        fixedThreadPool.shutdown();
    }
}
